#include "gpio.h"
static const uint32_t GPIO_PORT[] = {0x00,
                                     (uint32_t)P1,
                                     (uint32_t)P1 + 1,
                                     (uint32_t)P3,
                                     (uint32_t)P3 + 1,
                                     (uint32_t)P5,
                                     (uint32_t)P5 + 1,
                                     (uint32_t)P7,
                                     (uint32_t)P7 + 1,
                                     (uint32_t)P9,
                                     (uint32_t)P9 + 1,
                                     (uint32_t)PJ};
const uint8_t a = 1;
void GPIO_ModeSet(uint8_t gpio, uint8_t pin, GPIO_PinMode_t mode) {
  if (mode == GPIO_PIN_Output) {
    HWREG(GPIO_PORT[gpio] + PORT_DIR_DEVIATION) |= 1 << pin;
  } else {
    HWREG(GPIO_PORT[gpio] + PORT_DIR_DEVIATION) &= ~(1 << pin);
  }
}

void GPIO_WritePin(uint8_t gpio, uint8_t pin, GPIO_PinState_t mode) {
  if (mode == GPIO_PIN_SET) {
    HWREG(GPIO_PORT[gpio] + PORT_OUT_DEVIATION) |= 1 << pin;
  } else {
    HWREG(GPIO_PORT[gpio] + PORT_OUT_DEVIATION) &= ~(1 << pin);
  }
}

void GPIO_WriteAll(uint8_t gpio, uint8_t data) {
  HWREG(GPIO_PORT[gpio] + PORT_OUT_DEVIATION) = data;
}

void GPIO_SetModeAll(uint8_t gpio, uint8_t data) {
  HWREG(GPIO_PORT[gpio] + PORT_DIR_DEVIATION) = data;
}

void GPIO_Rolling(uint8_t gpio, uint8_t pin) {
  HWREG(GPIO_PORT[gpio] + PORT_OUT_DEVIATION) ^= 0x01 << pin;
}

void GPIO_Pull_Set(uint8_t gpio, uint8_t pin, GPIO_PinPull_t mode) {
  if (mode == GPIO_Pull_None) {
    HWREG(GPIO_PORT[gpio] + PORT_REN_DEVIATION) &= ~(1 << pin);
  } else if (mode = GPIO_Pull_Down) {
    HWREG(GPIO_PORT[gpio] + PORT_REN_DEVIATION) |= 1 << pin;
    GPIO_WritePin(gpio, pin, GPIO_PIN_RESER);
  } else {
    HWREG(GPIO_PORT[gpio] + PORT_REN_DEVIATION) |= 1 << pin;
    GPIO_WritePin(gpio, pin, GPIO_PIN_SET);
  }
}
uint8_t GPIO_InPut(uint8_t gpio, uint8_t pin) {
  return (HWREG(GPIO_PORT[gpio] + PORT_IN_DEVIATION) >> pin) % 2;
}
uint8_t GPIO_InPut_All(uint8_t gpio) {
  return (HWREG(GPIO_PORT[gpio] + PORT_IN_DEVIATION));
}
